/**
 * FighterCanvasElement类 代表战斗机
 * @constructor
 * @param {Object} options 战斗机的参数
 * @param {sting} options.imgSrc 战斗机的图片url
 * @param {number} [options.maxBullets=50] 子弹的最大数量
 * @param {number} [options.attackSpeed=8] 每秒的攻击次数
 * @param {number} [options.bulletSize=10] 子弹的长度
 * @param {number} [options.bulletSpeed=10] 子弹移动速度
 */
function FighterCanvasElement(options) {
  options = Object.assign({}, {
    imgSrc: '',
    maxBullets: 50,
    attackSpeed: 8,
    bulletSize: 10,
    bulletSpeed: 10,
  }, options);
  BaseCanvasElement.call(this, options);
  this.imgSrc = options.imgSrc;
  this.maxBullets = options.maxBullets;
  this.attackSpeed = options.attackSpeed;
  this.bulletSize = options.bulletSize;
  this.bulletSpeed = options.bulletSpeed;
  // 子弹
  this.bullets = [];
  // 开火的时间间隔(毫秒)
  shootTimeSpan = 0;
  // 上一次开火的时间
  lastShootTime = 0;
  // 飞机图像
  this.image = new Image();
  this.image.src = this.imgSrc;
  this.init();
}

inheritPrototype(FighterCanvasElement, BaseCanvasElement);

/**
 * init方法
 */
FighterCanvasElement.prototype.init = function () {
  this.setShootTimeSpan();
}

/**
 * render方法 将战斗机绘制到指定的context上,绘制结果应该只和实例的属性有关
 * @param {object} context 画布的 context 对象
 */
FighterCanvasElement.prototype.render = function (context) {
  // 绘制战斗机
  context.drawImage(this.image, this.x, this.y, this.width, this.height);
  // 更新子弹的位置并且绘制
  this.bullets = this.bullets.filter(function (bullet) {
    // 先画了再说(没有充足理由先更新数据,虽然效果似乎差不多)
    bullet.draw(context);
    // 下面都是更新数据
    // 向上移动
    bullet.move('up');
    // 对子弹进行边界检测,超出边界后销毁子弹
    var boundaryRestrictFlag = bullet.boundaryRestrict(null, true)
    if (boundaryRestrictFlag.top || boundaryRestrictFlag.bottom || boundaryRestrictFlag.right || boundaryRestrictFlag.left) {
      bullet.destroy();
    }
    if (bullet.shouldRemove) {
      // 从this.bullets移除
      return false;
    } else {
      return true;
    }
  });
}

/**
 * setShootTimeSpan方法 设置开火的时间间隔，单位是毫秒
 */
FighterCanvasElement.prototype.setShootTimeSpan = function () {
  this.shootTimeSpan = 1000 / this.attackSpeed;
}

/**
 * shouldShoot方法 是否应该开火
 */
FighterCanvasElement.prototype.shouldShoot = function () {
  if (this.bullets.length >= this.maxBullets) {
    // 子弹数量超过允许的最大子弹数量不该开火
    return false;
  }
  var now = +new Date();
  if (now - this.lastShootTime < this.shootTimeSpan) {
    // 距离上次开火的时间间隔小于开火允许的最小时间间隔，不准开火
    return false;
  } else {
    this.lastShootTime = now;
    return true;
  }
}

/**
 * shoot方法 射击方法
 */
FighterCanvasElement.prototype.shoot = function () {
  if (this.shouldShoot()) {
    this.bullets.push(new BulletCanvasElement({
      x: this.x + this.width / 2,
      y: this.y,
      vy: this.bulletSpeed,
      height: this.bulletSize,
      // 这里的boundaryCoordinates其实应该是计算得来的,但是在实例中得不到canvas对象,所以不好计算,可以改进.或者直接从options里取得.
      boundaryCoordinates: [30, 0, 700, 600]
    }))
  }
  console.log('当前子弹数量' + this.bullets.length);
}